#ifndef __SERVERORDER_H__
#define __SERVERORDER_H__

/**
 * @file serverorder.h
 * @brief Gestion des commandes du serveur.
 * @author Florian.B
 * @version 0.1
 * @date 9 octobre 2012
 *
 */

#include "server.h"
#include "../list/list.h"

/**
 * @enum ServerOrder
 * @brief Les différentes commandes que peut envoyer le serveur.
 *
 * ServerOrder est une série de constantes prédéfinies pour diverses fonction
 * futur de l'objet server.
 */
typedef enum
  {
    SERVERORDER_LIST, /*!< Le client veut la liste des fichiers. */
    SERVERORDER_GETF, /*!< Le client veut le fichier XXX et commencer le
      téléchargement avec Y octets. */
    SERVERORDER_QUIT, /*!< Le client se déconnecte. */
    SERVERORDER_FAIL, /*!< La commande reçu n'existe pas. */
    SERVERORDER_ERR, /*!< Erreur avec le client, la connexion doit être
      fermé. */
    SERVERORDER_NB_RET /*!< Le nombre de commande que peut éxecuter le
      serveur. */
  }ServerOrder;

/**
 * @enum ServerOrderReturn
 * @brief Constantes de retour.
 *
 * ServerOrderReturn est une série de constantes prédéfinies pour diverses
 * futures fonctions de l'objet Server.
 */
typedef enum
  {
    SERVERORDERRETURN_SUCCESS, /*!< Succès. */
    SERVERORDERRETURN_ERR, /*!< Erreur. */
    SERVERORDERRETURN_CLIENTQUIT, /*!< Le client se déconnecte. */
    SERVERORDERRETURN_CON_ERR, /*!< Problème de connexion avec le client. */
    SERVERORDERRETURN_NB_RET /*!< Nombre total de constantes de retour. */
  }ServerOrderReturn;

/**
 * @fn void beginingDealing_Server(Server *server.int socket)
 * @brief Commence la transaction avec le client.
 *
 * La transaction commence par le mot "HELO\n" puis les différentes commande
 * pour enfin se terminer avec le mot "OLEH\n".
 * @param socket La socket du client
 * @param server Le serveur
 */
void beginingDealing_Server(Server *server, int socket);

/**
 * @fn ServerOrderReturn dealing_Server(int socket, Server *serv)
 * @brief Traite les commandes du client socket.
 *
 * @param socket La socket du client.
 * @param serv Le server de fichier.
 * @return SERVERORDERRETURN_SUCCESS ou SERVERORDERRETURN_CON_ERR.
 */
ServerOrderReturn dealing_Server(int socket, Server *serv);

/**
 * @fn ServerOrder handleOrder_Server(int socket)
 * @brief Fonction de réception d'une commande d'un client. La fonction traite
 * ensuite la commande.
 *
 * @param socket La socket du client.
 * @param[in,out] mutexFile Le mutex sur les fichiers utilisés par les clients.
 * @return SERVER_QUIT pour finir la transaction, SERVER_ERR en cas d'erreur et
 * SERVER_SUCCESS sinon.
 */
ServerOrder handleOrder_Server(int socket);

/**
 * @fn ServerClientOrder orderString_Server(const char *reception)
 * @brief Fonction qui teste la commande du client et qui renvoie son type
 * défini dans l'enum ServerClientOrder.
 *
 * @param reception La commande à analyser.
 * @return Le type de la commande et FAIL si la commande n'existe pas.
 */
ServerOrder orderString_Server(const char *reception);

/**
 * @fn ServerReturn sendList_Server(int socket, const char *folder)
 * @brief Fonction qui envoie la liste des fichiers en terminant par "ENDL\n".
 *
 * @param socket La socjet du client.
 * @param folder Le dossier à lister.
 * @return SERVER_SUCCESS en cas de succès et SERVER_ERR sinon.
 */
ServerOrderReturn sendList_Server(int socket, List *lFolder);

void quit_ServerOrder(int socket);

#endif
